#include <regx52.h>
#include <INTRINS.H>

sbit DHT11_DQ_OUT=P2^0;

//DHT11延时函数 
void delay_dht11(unsigned int i)
{
	while(i--);
}


//DHT11延时1ms函数 
void delay_ms_dht11(unsigned int i)
{
	while(i--) delay_dht11(90);
}


/**
  * @brief  从DHT11读取一个字节函数
  * @param  无
  * @retval 读到的数据
  */
unsigned char DHT11_Read_Byte(void)    
{        
  unsigned char i,retry,dat=0;
	for (i=0;i<8;i++) 
	{
		dat<<=1;
		
		while(DHT11_DQ_OUT == 0);
		//等待50us低电平过去
		delay_dht11(3);						
		//延时30us
		if(DHT11_DQ_OUT)
			dat |= 0x01;
		
		retry=0;
		while(DHT11_DQ_OUT&&retry<100)
		//等待变为低电平 12-14us 开始
		{
			retry++;
			_nop_();
		}
	}
	return dat;
}


/**
  * @brief  从DHT11读取一次数据函数
  * @param  参量定义：	temp:温度值(范围:0~50°) humi:湿度值(范围:20%~95%)
  * @retval 返回值：0:正常; 1:读取失败
  */
unsigned char Dht11_Get_Temp_Humi_Value(unsigned int *temp,unsigned int *humi)
{        
 	unsigned char buf[5];
	unsigned char i;
	
	DHT11_DQ_OUT=0; 									
	//拉低DQ
	delay_ms_dht11(21);    						
	//拉低至少18ms
	DHT11_DQ_OUT=1; 									
	//DQ=1 
	delay_dht11(4);
	
	if(DHT11_DQ_OUT == 0)
	{
		while(DHT11_DQ_OUT == 0);				
		//等待80us的低电平过去
		while(DHT11_DQ_OUT == 1);				
		//等待80us的高电平过去
		for(i=0;i<5;i++)				 				
		//读取40位数据
		{
			buf[i]=DHT11_Read_Byte();
		}
		if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
		//校验和
		{
			*humi=buf[0]*10+buf[1];
			*temp=buf[2]*10+buf[3];
		}
		else
			return 1;
	}
	else
		return 1;
	return 0;	    
}




